package org.fjsei.yewu.job.config;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.io.IOException;

/*只能用JDBC 类型的job存储；
 配置jdbc: initialize-schema: EMBEDDED  #ALWAYS/EMBEDDED 不会重新做初始化；NEVER；
 【特殊】数据源用CRDB; 经常事务性fail的； 异常日志； Quartz自己会重新做。
  不能提前设置好分片参数的情形，就无法用mapData在Job层面分解多个job实例做并发作业的。
 由于Redis Cluster是分布式的，跨节点的事务操作并不保证原子性。如果事务涉及多个节点，每个节点上的操作可能会独立成功或失败。
 Infinispan虽然主要关注内存中的数据管理，也提供持久化支持将数据定期写入磁盘；持久化并非Infinispan的强制要求。Infinispan支持多种数据一致性模型，如强一致性、最终一致性等。
 在使用infinispan-hibernate-cache-v62这样的特定版本实现时，仍需infinispan-hibernate-cache-commons包支持。热点数据方案还是缓存+数据库。
* */
@Configuration
@RequiredArgsConstructor
public class QuartzDataSourceConfig {

    private final DataSource dataSource;
    @Autowired
    private AutowiringSpringBeanJobFactory  myJobFactory;


    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        //在quartz.properties中的属性被读取并注入后再初始化对象
        propertiesFactoryBean.afterPropertiesSet();
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setQuartzProperties(propertiesFactoryBean.getObject());
        schedulerFactoryBean.setDataSource(dataSource); //Link the Spring boot Datasource to Quartz
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        schedulerFactoryBean.setJobFactory(myJobFactory);   //将job实例化，能够操作进行Spring 注入

        return schedulerFactoryBean;
    }

    //    @Bean
//    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
//        //获取配置属性
//        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
//        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
//        //在quartz.properties中的属性被读取并注入后再初始化对象
//        propertiesFactoryBean.afterPropertiesSet();
//        //创建SchedulerFactoryBean
//        SchedulerFactoryBean factory = new SchedulerFactoryBean();
//        factory.setQuartzProperties(propertiesFactoryBean.getObject());
//        //使用数据源，自定义数据源
////        factory.setDataSource(dataSource);
//
//        factory.setQuartzProperties(propertiesFactoryBean.getObject());
//        //https://blog.csdn.net/javaMyGod/article/details/144605838
    ////        factory.setJobFactory(jobFactory); //支持在JOB实例中注入其他的业务对象
//        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//        factory.setWaitForJobsToCompleteOnShutdown(true);//这样当spring关闭时，会等待所有已经启动的quartz job结束后spring才能完全shutdown。
//        factory.setOverwriteExistingJobs(false);//是否覆盖己存在的Job
//        factory.setStartupDelay(10);//QuartzScheduler 延时启动，应用启动完后 QuartzScheduler 再启动
//
//        return factory;
//    }


    //没办法获取entityManager
//    @Bean
//    public DataSourceTransactionManager transactionManager() {
//        return new DataSourceTransactionManager(dataSource);
//    }

}